Ejercicio: satisfacción de los pacientes

Práctica guiada (clase 4)

Author

Silvia Pineda, Almudena Moreno y Javier Álvarez Liébana

Práctica 1

Para este ejercicio usaremos la tabla de datos de satisfacción de pacientes en un hospital guardada en el archivo .csv llamada SatisfaccionPacientes.csv

Cargamos las librerías necesarias

library(tidyverse)

Lectura de ficheros y normalización de nombres

datos <-
  read_csv("./datos/SatisfaccionPacientes.csv") |> 
  janitor::clean_names()

Pregunta 1

Aplica el código que sea necesario para determinar el tamaño muestral, el número de variables y el tipo de estas.

Code
# Tamaño muestral/ número de observaciones
n <- nrow(datos)

#Número de variables
p <- ncol(datos)

# Tipo de variables
datos

Pregunta 2

Obtén la tabla de frecuencias de las variables cualitativas (lo que puedas) y luego contesta a las siguientes preguntas:

  • ¿Cuántas mujeres hay?

  • ¿Cuántos individuos están casados?

  • ¿Qué porcentaje de individuos tienen un estado de salud Regular o Malo?

  • ¿Harías alguna cosa con la tabla de frecuencia de estado de salud?

Code
# no podemos calcular acumulados ya que son genero es nominal
datos |> 
  count(genero) |> 
  rename(frecuencia_abs = n) |> 
  mutate(frecuencia_rel = frecuencia_abs/sum(frecuencia_abs))

# Hay 53 mujeres

datos |> 
  count(estado_civil) |> 
  rename(frecuencia_abs = n) |> 
  mutate(frecuencia_rel = frecuencia_abs/sum(frecuencia_abs))

# Hay 26 personas casadas

datos <-
  datos |>
  mutate(estado_salud =
           factor(estado_salud, levels = c("Malo", "Regular", "Bueno", "Excelente"),
                  ordered = TRUE))
datos |> 
  count(estado_salud) |> 
  rename(frecuencia_abs = n) |> 
  mutate(frecuencia_rel = frecuencia_abs/sum(frecuencia_abs),
         frecuencia_acum_abs = cumsum(frecuencia_abs),
         frecuencia_acum_rel = cumsum(frecuencia_rel))

datos |>
  count(estado_salud <= "Regular")
# Hay 44+15 = 59 personas con un estado de salud malo o regular. 

# Sería conveniente juntar la categoría excelente con bueno ya que no hay 
# suficientes individuos dentro de la primera categoría. Se suele considerar 
# por lo general que todas las categorías deben contener al menos un 5% de los 
# individuos de toda la muestra. 

datos <- 
  datos |> 
  mutate(estado_salud  = if_else(estado_salud  == "Excelente", "Bueno", estado_salud),
         estado_salud =
           factor(estado_salud, levels = c("Malo", "Regular", "Bueno"),
                  ordered = TRUE))

Pregunta 3

Calcula la media, mediana, cuartiles y desviación típica de las variables cuantitativas (veremos una forma más eficiente de hacerlo pero de momento, una a una). Guarda los resultados en resumen y expórtalo a un resumen.csv

Code
resumen <-
  datos |>
  summarise(media_edad = mean(edad), sd_edad = sd(edad),
            mediana_edad = median(edad),
            Q1_edad = quantile(edad, probs = 0.25),
            Q3_edad = quantile(edad, probs = 0.75),
            # tiempo espera
            media_tiempo_espera = mean(tiempo_espera), 
            sd_tiempo_espera = sd(tiempo_espera),
            mediana_tiempo_espera = median(tiempo_espera),
            min_tiempo_espera = min(tiempo_espera),
            Q1_tiempo_espera = quantile(tiempo_espera, probs = 0.25),
            Q3_tiempo_espera = quantile(tiempo_espera, probs = 0.75),
            # grado satisfaccion
            media_grado_satisfaccion = mean(grado_satisfaccion),
            sd_grado_satisfaccion = sd(grado_satisfaccion),
            mediana_grado_satisfaccion = median(grado_satisfaccion),
            Q1_grado_satisfaccion = quantile(grado_satisfaccion, probs = 0.25),
            Q3_grado_satisfaccion = quantile(grado_satisfaccion, probs = 0.75),
            # número visitas
            media_numero_visitas  = mean(numero_visitas),
            sd_numero_visitas  = sd(numero_visitas),
            mediana_numero_visitas  = median(numero_visitas),
            Q1_numero_visitas  = quantile(numero_visitas, probs = 0.25),
            Q3_numero_visitas  = quantile(numero_visitas, probs = 0.75))
write_csv(resumen, file = "./datos/resumen.csv")

Pregunta 4

Crear un diagrama de barras para la variable género

Code
# Género
ggplot(datos) +
  geom_bar(aes(x = genero, fill = genero), alpha = 0.75) +
  ggthemes::scale_fill_colorblind() +
  labs(title = "Diagrama de barras de la variable género", 
       x = "Categoría", y = "Frecuencia absoluta",
       fill = "Categoría") +
  theme_minimal() 

Pregunta 5

Crear un diagrama de barras para la variable estado de salud

Code
# Estado de salud (el orden importa)
ggplot(datos) +
  geom_bar(aes(x = estado_salud, fill = estado_salud)) +
  ggthemes::scale_fill_colorblind() +
  labs(title = "Diagrama de barras de la variable estado salud", 
       x = "Categoría", 
       y = "Frecuencia absoluta",
       fill = "Categoría") +
  theme_minimal() 

Pregunta 6

Crear un histograma y un gráfico de densidad para las variable edad, tiempo de espera y grado de satisfacción. ¿Crees que todas deberían representarse mediante este tipo de gráficos? ¿Qué propondrías?

Code
ggplot(datos) +
  # Define el ancho de las barras y colores
  geom_histogram(aes(x = edad), bins = 30, fill = "darkorange", alpha = 0.75) + 
  labs(title = "Histograma de edad",
       subtitle = "Bins = 30",
       x = "Valores", y = "Frecuencia absoluta") +
  theme_minimal()

ggplot(datos) +
  geom_density(aes(x = edad), color = "darkorange", 
               fill = "darkorange", alpha = 0.75) + 
  labs(title = "Gráfico de densidad de edad",
       x = "Valores", y = "Frecuencia relativa") +
  theme_minimal()

ggplot(datos) +
  # Define el ancho de las barras y colores
  geom_histogram(aes(x = tiempo_espera), bins = 30, fill = "orchid", alpha = 0.75) + 
  labs(title = "Histograma de tiempo de espera",
       subtitle = "Bins = 30",
       x = "Valores", y = "Frecuencia absoluta") +
  theme_minimal()

ggplot(datos) +
  geom_density(aes(x = tiempo_espera), color = "orchid", 
               fill = "orchid", alpha = 0.75) + 
  labs(title = "Gráfico de densidad de tiempo de espera",
       x = "Valores", y = "Frecuencia relativa") +
  theme_minimal()

# Representación regular, no aporta ni resume
ggplot(datos) +
  # Define el ancho de las barras y colores
  geom_histogram(aes(x = grado_satisfaccion),
                 bins = 30, fill = "#308b8e", alpha = 0.75) + 
  labs(title = "Histograma de grado de satisfacción",
       subtitle = "Bins = 30",
       x = "Valores", y = "Frecuencia absoluta") +
  theme_minimal()

# Las variables discretas se pueden representar con una diagrama de barras
ggplot(datos) +
  geom_bar(aes(x = grado_satisfaccion), fill = "#308b8e", alpha = 0.7) + 
  labs(title = "Diagrama de barras del Grado de satisfacción", 
       x = "Grado de satisfacción", 
       y = "Frecuencia absoluta") +
  scale_x_continuous(breaks = 5:10) + 
  theme_minimal()

Pregunta 7

Realiza un boxplot para edad y un boxplot para numero de visitas por género y contesta a las siguientes preguntas:

  • ¿La variable edad tiene outliers? ¿Qué edad tienen esos pacientes?

  • ¿Quién ha esperado más los hombres o las mujeres?

Code
# Crear un boxplot de la variable Edad
ggplot(datos) +
  geom_boxplot(aes(y = edad), fill = "lightblue", alpha = 0.75,
               # Personaliza los outliers
               outlier.colour = "red", outlier.shape = 16, 
               outlier.size = 2) +  
  labs(title = "Boxplot de edad", 
       y = "Edad") +
  theme_minimal()

# Crear un boxplot de numero de visitas por Género
ggplot(datos) +
  geom_boxplot(aes(x = genero, y = tiempo_espera, fill = genero),
               alpha = 0.75,
               # Personaliza los outliers
               outlier.colour = "red",
               outlier.shape = 16,
               outlier.size = 2) +  # Personaliza los outliers
  labs(title = "Boxplot de tiempo de espera por género", 
       x = "Género", y = "Tiempo de Espera") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3")  # Usar una paleta de colores